﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ZedGraph;
using System.Collections;

namespace ABM_De_Empleados
{
	public partial class Ventana : Form
	{

		Grafico_de_barras_vertical grafico_1;
		Grafico_de_barras_vertical grafico_2;
		Grafico_redondo grafico_circular;
		Grafico_de_puntos grafico_4;

		Button boton_generar_grafico_1;
		Button boton_generar_grafico_2;
		Button boton_generar_grafico_3;
		Button boton_generar_grafico_4;

		// Esto permite conocer luego la cantidad de días hábiles del mes, aunque en el gráfico 3, gracias
		// a la sobrecarga del método que permite conocer, en base a un mes y año la cantidad de días hábiles
		// que tiene el mes no necesita un DateTime.
		DateTime fechin;

		DataSet data_set = new DataSet ();

		//Globales porque varios graficos lo utilizan.
		ComboBox combo_dni_del_cliente = new ComboBox ();
		ComboBox combo_mes = new ComboBox ();
		ComboBox combo_anio = new ComboBox ();

		System.Windows.Forms.Label etiqueta_del_combo_dni_del_cliente = new System.Windows.Forms.Label ();
		System.Windows.Forms.Label etiqueta_del_combo_del_mes = new System.Windows.Forms.Label ();
		System.Windows.Forms.Label etiqueta_del_combo_del_anio = new System.Windows.Forms.Label ();

		Point punto_del_objeto = new Point (); // Para darle la localizacion al combo/etiqueta.
		Size tamanio = new Size ();            // Un tamaño para los combos y etiquetas.

		// Esto permite que los botones sean mutuamente excluyentes.
		// Además oculta los combobox que no corresponde al gráfico activo.
		private bool[] verificador_de_visualizaciones = new bool[4];

		private int[] anios = new int[30];
		private int[] meses = new int[12];
		
		// Este vector permite conocer si un gráfico se generó anteriormente. Si eso sucedió, entonces se llama a un método para limpiar el gráfico. 
		private bool[] vector_para_borrado = new bool[4];

		// Las siguientes son consultas para el combo del dni y para el tercer gráfico. Para los demás gráficos están los procedimientos
		// almacenados. Constantes y globales porque son más fáciles de modificar.
		const String consulta_del_combo_dni = "SELECT dni FROM empleados ORDER BY dni ASC";
		const String consulta_de_dni_y_nombres_de_los_clientes = "SELECT dni, nombre , apellido from Empleados";
		//const String consulta_del_tercer_grafico = "select dni, datepart(day, fechaingreso) as dia, datepart(month, fechaingreso) as mes, datepart(year, fechaingreso) as anio from ingreso order by dni, datepart(year, fechaingreso), datepart(month, fechaingreso), datepart(day, fechaingreso) asc";

		const String ruta_a_la_bd = "Data Source=localhost;Initial Catalog=ControlAsistenciaEmpleado;Integrated Security=True";
		//const String ruta_a_la_bd = "Data Source=QUETE-PC\\SQLEXPRESS;Initial Catalog=ControlAsistenciaEmpleado;Integrated Security=True";

		public Ventana()
		{
			InitializeComponent ();
		}

		/*
		 * PARA TODOS LOS GRÁFICOS:
		 * La forma de tomar datos y generar los gráficos es la siguiente...
		 * Cuando uno presiona un botón por primera vez, se instancia el gráfico y se ajustan
		 * ciertas propiedades tanto del formulario (para su posición) como del gráfico a mostrar
		 * (una especie de presentación sin datos).
		 * 
		 * Luego, para ir cambiando entre gráficos, con el verificador_de_visualizaciones
		 * se modifica la propiedad visible, tanto del gráfico como del botón como de sus combos
		 * y etiquetas.
		 * 
		 * Cuando el gráfico permanece en pantalla, se espera a que el usuario seleccione un dni, mes, año
		 * según corresponda. Luego, al presionar el botón generar, se llama a un método ligado a un evento click.
		 * 
		 * Ahí adentro se toma datos de la base.
		 * En una variable, la cantidad de días hábiles del mes y año seleccionado (si corresponde).
		 * Se cuenta las ausencias según la estructura de la tabla en el data set y según el gráfico a generar.
		 * En el gráfico, para el eje x, toma del dni seleccionado, su nombre y luego lo agrega al gráfico.
		 * En el caso del eje Y, sería (Días habiles del mes - dias presente).
		 */

		private void btn_ausentismo_de_un_empleado_por_mes_y_anio_Click (object sender, EventArgs e)
		{

			verificador_de_visualizaciones[0] = true;
			
			btn_ausentismo_de_un_empleado_por_mes_y_anio.Enabled = false;

			if (verificador_de_visualizaciones[1] == true)
			{
				grafico_2.Visible = false;
				boton_generar_grafico_2.Visible = false;
				btn_cinco_empleados_que_mas_faltaron_en_un_determinado_mes_y_anio.Enabled = true;
				verificador_de_visualizaciones[1] = false;
			}

			if (verificador_de_visualizaciones[2] == true)
			{
				grafico_circular.Visible = false;
				boton_generar_grafico_3.Visible = false;
				btn_cinco_empleados_que_mas_faltaron_desde_su_alta.Enabled = true;
				verificador_de_visualizaciones[2] = false;
			}

			if (verificador_de_visualizaciones[3] == true)
			{
				grafico_4.Visible = false;
				boton_generar_grafico_4.Visible = false;
				btn_rango_de_entrada_y_salida_en_promedio_de_un_determinado_empleado.Enabled = true;
				verificador_de_visualizaciones[3] = false;
			}

			grafico_1 = new Grafico_de_barras_vertical ("grafico_1");
			
			boton_generar_grafico_1 = new Button ();

			boton_generar_grafico_1.Visible = true;

			// Al boton generar gráfico le asigno el evento Click.
			boton_generar_grafico_1.Click += new EventHandler (boton_generar_grafico1_Click);

			this.inicializar_boton_generar_grafico (ref boton_generar_grafico_1, 500, 20);

			Controls.Add (grafico_1);
			Controls.Add (boton_generar_grafico_1);

			// Se ajustan las propiedades visible de las etiquetas y combos en true, ya que otros gráficos no la utilizan.
			etiqueta_del_combo_dni_del_cliente.Visible = true;
			etiqueta_del_combo_del_mes.Visible = true;
			etiqueta_del_combo_del_anio.Visible = true;

			combo_dni_del_cliente.Visible = true;
			combo_mes.Visible = true;
			combo_anio.Visible = true;

			// Como ya se agregó al dataset la tabla con los dni de los clientes, ahora se carga el combo con esa tabla sólo si no fué
			// cargado antes.
			if (combo_dni_del_cliente.Items.Count == 0)
			{
				agregar_a_combobox_dni_de_los_clientes_todos_los_dnis_del_data_set (ref combo_dni_del_cliente, ref data_set);
			}

			// Agrega los datos a los combos únicamente si no tiene.

			if ((combo_mes.Items.Count == 0) || (combo_anio.Items.Count == 0))
			{
				agregar_meses_al_combo_mes (ref combo_mes);
				agregar_anios_al_combo_anio (ref combo_anio);
			}

			// Configura los titulos del gráfico
			grafico_1.agregar_titulo_al_grafico_de_barras ("Ausentismo de cada empleado por mes y año", "Nombre del empleado", "Días ausente");

			// Cada eje contiene es de un determinado tipo.
			grafico_1.modificar_tipos_de_ejes (AxisType.Text, AxisType.Date);

			// Se ajusta algunas propiedades de X, para que tenga en cuenta la cantidad de etiquetas a mostrar.
			grafico_1.GraphPane.XAxis.Scale.MinorStep = 1;

			grafico_1.GraphPane.YAxis.Type = AxisType.Linear;
			grafico_1.GraphPane.YAxis.Scale.Format = "";
			grafico_1.GraphPane.YAxis.Scale.MajorUnit = DateUnit.Day;
			grafico_1.GraphPane.YAxis.Scale.MinorUnit = DateUnit.Day;
			grafico_1.GraphPane.YAxis.Scale.MinorStep = 1;
			grafico_1.GraphPane.YAxis.Scale.MajorStep = 5;

			// Escala de y
			grafico_1.modificar_escala_y (0, 31);

		}

		private void boton_generar_grafico1_Click (object sender, EventArgs e)
		{
			int cantidad_de_dias_habiles_del_mes_seleccionado = 0;
			int cantidad_de_dias_ausente;

			int dni_combo, anio_combo, mes_combo;

			String nombre_del_empleado_elegido = "Luego tendra su valor correcto";

			Acceso_a_datos acceso_a_datos = new Acceso_a_datos ();

			// Sólo genera el gráfico si se seleccionó algo de los combos. 
			if (combo_mes.SelectedItem != null && combo_anio.SelectedItem != null && combo_dni_del_cliente.SelectedItem != null)
			{
				// Primero limpia el gráfico de datos anteriores...
				if (vector_para_borrado[0] == true)
				{
					grafico_1.limpiar_grafico ("Ausentismo de cada empleado por mes y año", "Nombre del empleado", "Días ausente");

					// Cada eje contiene es de un determinado tipo.
					grafico_1.modificar_tipos_de_ejes (AxisType.Text, AxisType.Date);

					// Se ajusta algunas propiedades de X, para que tenga en cuenta la cantidad de etiquetas a mostrar.
					grafico_1.GraphPane.XAxis.Scale.MinorStep = 1;

					grafico_1.GraphPane.YAxis.Type = AxisType.Linear;
					grafico_1.GraphPane.YAxis.Scale.Format = "";
					grafico_1.GraphPane.YAxis.Scale.MajorUnit = DateUnit.Day;
					grafico_1.GraphPane.YAxis.Scale.MinorUnit = DateUnit.Day;
					grafico_1.GraphPane.YAxis.Scale.MinorStep = 1;
					grafico_1.GraphPane.YAxis.Scale.MajorStep = 5;

					// Escala de y
					grafico_1.modificar_escala_y (0, 31);
				}

				// Configura la fecha para conocer si el año es bisiesto, la cantidad de dias del mes, &c.
				dni_combo = (int) combo_dni_del_cliente.SelectedItem;
				mes_combo = (int) combo_mes.SelectedItem;
				anio_combo = (int) combo_anio.SelectedItem;

				fechin = new DateTime (anio_combo, mes_combo, 1);

				cantidad_de_dias_habiles_del_mes_seleccionado = (get_cantidad_de_dias_en_el_mes (fechin) - get_cantidad_de_fines_de_semana (fechin));

				// Primero genera la tabla en el DataSet llamada tabla_del_grafico_1.
				acceso_a_datos.ruta_a_la_base_de_datos = ruta_a_la_bd;
				acceso_a_datos.sentencia_de_sql = "EXECUTE ausentismo_de_un_empleado_en_particular_por_mes_y_anio " + dni_combo.ToString () + "," + mes_combo.ToString () + "," + anio_combo.ToString () ;
				acceso_a_datos.conectar_a_la_base_de_datos ();
				acceso_a_datos.obtener_el_adaptador ();
				acceso_a_datos.agregar_los_datos_a_una_tabla_en_el_data_set (ref data_set, "tabla_del_grafico_1");

				/*
				 * Se tendrá en cuenta si se elije el mes actual ya que de otra forma calcularía sobre el total
				 * de este mes generando resultados erróneos.
				 * 
				 * Si bien a simple vista confunde, la fórmula es: dias ausente = (dias habiles - dias presente)
				 */

				cantidad_de_dias_ausente = 0;

				// Si el mes coincide con el mes actual y el año coincide con el año actual...
				if (mes_combo == DateTime.Today.Month && anio_combo == DateTime.Today.Year)
				{
					cantidad_de_dias_ausente = ((DateTime.Today.Day - get_cantidad_de_fines_de_semana_desde_el_comienzo_del_actual_mes_hasta_el_dia_actual ()) - data_set.Tables["tabla_del_grafico_1"].Rows.Count);
					
				}
				else
				{
					cantidad_de_dias_ausente = (cantidad_de_dias_habiles_del_mes_seleccionado - data_set.Tables["tabla_del_grafico_1"].Rows.Count);
				}

				// Luego se genera la etiqueta para el empleado siempre y cuando tenga un registro en la fecha
				// indicada. Este dato está en otra tabla del data_set llamada "dni_y_nombre_de_los_empleados".

				if (data_set.Tables["tabla_del_grafico_1"].Rows.Count > 0)	// Osea, si el empleado tiene registros en el mes...
				{
					nombre_del_empleado_elegido = this.obtener_nombre_segun_el_dni (dni_combo);

					grafico_1.agregar_etiqueta (nombre_del_empleado_elegido);

					grafico_1.agregar_punto_de_dato (cantidad_de_dias_ausente);

					// Se agrega el nombre del empleado a la barra.
					grafico_1.agregar_nombre_a_la_barra (grafico_1.etiquetas[0]);

					// Se agrega un color a la barra.
					grafico_1.agregar_color_a_la_barra (Color.Tomato);

					// Se agrega un color al centro de la barra.
					grafico_1.agregar_color_al_centro_de_la_barra (Color.Snow);

					// Se dibuja la barra.
					grafico_1.agregar_barra ();

					grafico_1.refrescar_grafico ();

					data_set.Tables["tabla_del_grafico_1"].Clear ();
					vector_para_borrado[0] = true;
				}
				else
				{
					data_set.Tables["tabla_del_grafico_1"].Clear ();
					nombre_del_empleado_elegido = this.obtener_nombre_segun_el_dni (dni_combo);
					MessageBox.Show (nombre_del_empleado_elegido + " no tiene registros en el mes y año seleccionados");
				}
			}

			
		}

		private void btn_cinco_empleados_que_mas_faltaron_en_un_determinado_mes_y_anio_Click (object sender, EventArgs e)
		{
			verificador_de_visualizaciones[1] = true;
			
			btn_cinco_empleados_que_mas_faltaron_en_un_determinado_mes_y_anio.Enabled = false;

			if (verificador_de_visualizaciones[0] == true)
			{
				grafico_1.Visible = false;
				boton_generar_grafico_1.Visible = false;
				btn_ausentismo_de_un_empleado_por_mes_y_anio.Enabled = true;
				verificador_de_visualizaciones[0] = false;
			}

			if (verificador_de_visualizaciones[2] == true)
			{
				grafico_circular.Visible = false;
				boton_generar_grafico_3.Visible = false;
				btn_cinco_empleados_que_mas_faltaron_desde_su_alta.Enabled = true;
				verificador_de_visualizaciones[2] = false;
			}

			if (verificador_de_visualizaciones[3] == true)
			{
				grafico_4.Visible = false;
				boton_generar_grafico_4.Visible = false;
				btn_rango_de_entrada_y_salida_en_promedio_de_un_determinado_empleado.Enabled = true;
				verificador_de_visualizaciones[3] = false;
			}

			grafico_2 = new Grafico_de_barras_vertical ("grafico_2");
			boton_generar_grafico_2 = new Button ();
			this.inicializar_boton_generar_grafico (ref boton_generar_grafico_2, 500, 20);

			boton_generar_grafico_2.Visible = true;

			// Al boton generar gráfico le asigno el evento Click.
			boton_generar_grafico_2.Click += new EventHandler (boton_generar_grafico2_Click);
			this.inicializar_boton_generar_grafico (ref boton_generar_grafico_2, 500, 20);

			// Configura la posicion  y texto de los combos
			// Solo se modifica algunas veces X para que esten alineados.
			// Se modifica además su tamaño.

			Controls.Add (grafico_2);
			Controls.Add (boton_generar_grafico_2);

			// Se ajustan las propiedades visible de las etiquetas y combos en true, ya que otros gráficos no la utilizan.
			etiqueta_del_combo_dni_del_cliente.Visible = false;
			etiqueta_del_combo_del_mes.Visible = true;
			etiqueta_del_combo_del_anio.Visible = true;

			combo_dni_del_cliente.Visible = false;
			combo_mes.Visible = true;
			combo_anio.Visible = true;

			// Configura los titulos del gráfico
			grafico_2.agregar_titulo_al_grafico_de_barras ("Cinco empleados que mas faltaron en un determinado mes y año", "Nombre del empleado", "Días ausente");

			// Cada eje contiene es de un determinado tipo.
			grafico_2.modificar_tipos_de_ejes (AxisType.Text, AxisType.Ordinal);

			// Escala de y
			grafico_2.modificar_escala_y (0, 31);

			// Se ajusta algunas propiedades de X, para que tenga en cuenta la cantidad de etiquetas a mostrar.
			grafico_2.GraphPane.XAxis.Scale.MinorStep = 5;

			// Se ajusta algunas propiedades de X, para que tenga en cuenta la cantidad de etiquetas a mostrar.
			grafico_2.GraphPane.XAxis.Scale.MinorStep = 1;

			grafico_2.GraphPane.YAxis.Type = AxisType.Linear;
			grafico_2.GraphPane.YAxis.Scale.Format = "";
			grafico_2.GraphPane.YAxis.Scale.MajorUnit = DateUnit.Day;
			grafico_2.GraphPane.YAxis.Scale.MinorUnit = DateUnit.Day;
			grafico_2.GraphPane.YAxis.Scale.MinorStep = 1;
			grafico_2.GraphPane.YAxis.Scale.MajorStep = 5;
		}

		private void boton_generar_grafico2_Click (object sender, EventArgs e)
		{
			Acceso_a_datos acceso_a_datos = new Acceso_a_datos ();

			int cantidad_de_dias_habiles_del_mes_seleccionado;
			int cantidad_de_dias_presente;
			int cantidad_de_dias_ausente;
			int posicion_de_la_fila_a_copiar = 0;

			int cantidad_de_personas = data_set.Tables["dni_y_nombre_de_los_empleados"].Rows.Count;

			int posmax, dni_aux, ausencias_aux;

			// Esta matriz tomará cada dni y ausencias para luego generar el gráfico con el nombre y apellido (tomado del dni) y la cantidad de días ausentes (tomado de la segunda columna).
			int[,] tabla_dni_y_ausencias = new int[cantidad_de_personas, 2];

			int anio_combo, mes_combo;

			// Sólo realiza la acción si hay un ítem de cada combo seleccionado.
			if (combo_mes.SelectedItem != null && combo_anio.SelectedItem != null)
			{
				// Primero limpia el gráfico de datos anteriores.
				if (vector_para_borrado[1] == true)
				{
					grafico_2.limpiar_grafico ("Cinco empleados que mas faltaron en un determinado mes y año", "Nombre del empleado", "Días ausente");

					// Cada eje contiene es de un determinado tipo.
					grafico_2.modificar_tipos_de_ejes (AxisType.Text, AxisType.Ordinal);

					// Escala de y
					grafico_2.modificar_escala_y (0, 31);

					// Se ajusta algunas propiedades de X, para que tenga en cuenta la cantidad de etiquetas a mostrar.
					grafico_2.GraphPane.XAxis.Scale.MinorStep = 5;

					// Se ajusta algunas propiedades de X, para que tenga en cuenta la cantidad de etiquetas a mostrar.
					grafico_2.GraphPane.XAxis.Scale.MinorStep = 1;

					grafico_2.GraphPane.YAxis.Type = AxisType.Linear;
					grafico_2.GraphPane.YAxis.Scale.Format = "";
					grafico_2.GraphPane.YAxis.Scale.MajorUnit = DateUnit.Day;
					grafico_2.GraphPane.YAxis.Scale.MinorUnit = DateUnit.Day;
					grafico_2.GraphPane.YAxis.Scale.MinorStep = 1;
					grafico_2.GraphPane.YAxis.Scale.MajorStep = 5;

					
				}

				// Configura la fecha para conocer si el año es bisiesto, la cantidad de dias del mes, &c.
				mes_combo = (int) combo_mes.SelectedItem;
				anio_combo = (int) combo_anio.SelectedItem;

				for (int i = 0; i < cantidad_de_personas; i++)
				{
					tabla_dni_y_ausencias[i, 0] = 0;
					tabla_dni_y_ausencias[i, 1] = 0;
				}

				/*
				 * Calcula la cantidad de dias habiles del mes seleccionado teniendo en cuenta
				 * si se trata del mes actual o de un mes diferente; porque por ej. si es día
				 * 15 calcularía sobre el mes entero entregando resultados erróneos.
				 */

				// Si coincide la fecha elegida en los combos con la fecha actual...
				if (mes_combo == DateTime.Today.Month && anio_combo == DateTime.Today.Year)
				{
					cantidad_de_dias_habiles_del_mes_seleccionado = (DateTime.Today.Day - get_cantidad_de_fines_de_semana_desde_el_comienzo_del_actual_mes_hasta_el_dia_actual ());
				}
				else
				{
					cantidad_de_dias_habiles_del_mes_seleccionado = (get_cantidad_de_dias_en_el_mes(anio_combo, mes_combo) - get_cantidad_de_fines_de_semana(anio_combo, mes_combo));
				}

				// Por cada dni existente...
				for (int i = 0; i < combo_dni_del_cliente.Items.Count; i++)
				{
					// Primero genera la tabla para este dni [i].
					acceso_a_datos.ruta_a_la_base_de_datos = ruta_a_la_bd;
					acceso_a_datos.sentencia_de_sql = "EXECUTE cinco_empleados_que_mas_faltaron_en_un_mes_y_anio " + combo_dni_del_cliente.Items[i].ToString() + "," + mes_combo.ToString () + "," + anio_combo.ToString ();
					acceso_a_datos.conectar_a_la_base_de_datos ();
					acceso_a_datos.obtener_el_adaptador ();
					acceso_a_datos.agregar_los_datos_a_una_tabla_en_el_data_set (ref data_set, "tabla_del_grafico_2");

					cantidad_de_dias_presente = data_set.Tables["tabla_del_grafico_2"].Rows.Count;

					if (cantidad_de_dias_presente > 0)		// Sólo realiza la barra para las personas que vinieron.
					{
						cantidad_de_dias_ausente = (cantidad_de_dias_habiles_del_mes_seleccionado - cantidad_de_dias_presente);

						// En la matriz se guarda el dni (primer columna)...
						tabla_dni_y_ausencias[posicion_de_la_fila_a_copiar, 0] = (int) combo_dni_del_cliente.Items[i];

						// ...y luego la ausencia.
						tabla_dni_y_ausencias[posicion_de_la_fila_a_copiar, 1] = cantidad_de_dias_ausente;

						// Para la siguiente iteración, se incrementará la fila de la matriz dni y ausencias.
						// Además se limpia la tabla para prepararla en la siguiente vuelta del for.
						posicion_de_la_fila_a_copiar++;
						data_set.Tables["tabla_del_grafico_2"].Clear ();
					}
				}

			
			//        // A este punto ya se cargo la tabla con los dni y sus respectivas ausencias.
			//        // Entonces se ordena por el campo cantidad de ausencias de forma descendente
			//        // con el famoso algoritmo de programación 1.

				for (int i = 0; i < (cantidad_de_personas-1); i++)
				{
					posmax = i;

					for (int z = (i + 1); z < cantidad_de_personas; z++)
					{
						if (tabla_dni_y_ausencias[z, 1] > tabla_dni_y_ausencias[posmax, 1])
						{
							posmax = z;
						}
					}

					dni_aux = tabla_dni_y_ausencias[posmax, 0];
					ausencias_aux = tabla_dni_y_ausencias[posmax, 1];

					tabla_dni_y_ausencias[posmax, 0] = tabla_dni_y_ausencias[i, 0];
					tabla_dni_y_ausencias[posmax, 1] = tabla_dni_y_ausencias[i, 1];

					tabla_dni_y_ausencias[i, 0] = dni_aux;
					tabla_dni_y_ausencias[i, 1] = ausencias_aux;
				}

				// Tomo los primeros 5 de la lista que tengan ausencias, y luego los agrego al gráfico de barras.
				// Idem para los demás condicionales.
				if (tabla_dni_y_ausencias[0, 1] != 0)
				{
					grafico_2.agregar_etiqueta (obtener_nombre_segun_el_dni (tabla_dni_y_ausencias[0, 0]));
					grafico_2.agregar_nombre_a_la_barra (grafico_2.etiquetas[0]);
					grafico_2.agregar_punto_de_dato (tabla_dni_y_ausencias[0, 1]);
					grafico_2.agregar_color_a_la_barra (Color.Tomato);
					grafico_2.agregar_color_al_centro_de_la_barra (Color.Snow);

					// Se dibuja la barra.
					grafico_2.agregar_barra ();

				}

				if (tabla_dni_y_ausencias[1, 1] != 0)
				{
					grafico_2.agregar_etiqueta (obtener_nombre_segun_el_dni (tabla_dni_y_ausencias[1, 0]));
					grafico_2.agregar_nombre_a_la_barra (grafico_2.etiquetas[1]);
					grafico_2.agregar_punto_de_dato (tabla_dni_y_ausencias[1, 1]);
					grafico_2.agregar_color_a_la_barra (Color.Blue);
					grafico_2.agregar_color_al_centro_de_la_barra (Color.Snow);

					grafico_2.agregar_barra ();
				}

				if (tabla_dni_y_ausencias[2, 1] != 0)
				{
					grafico_2.agregar_etiqueta (obtener_nombre_segun_el_dni (tabla_dni_y_ausencias[2, 0]));
					grafico_2.agregar_nombre_a_la_barra (grafico_2.etiquetas[2]);
					grafico_2.agregar_punto_de_dato (tabla_dni_y_ausencias[2, 1]);
					grafico_2.agregar_color_a_la_barra (Color.YellowGreen);
					grafico_2.agregar_color_al_centro_de_la_barra (Color.Snow);

					grafico_2.agregar_barra ();
				}

				if (tabla_dni_y_ausencias[3, 1] != 0)
				{
					grafico_2.agregar_etiqueta (obtener_nombre_segun_el_dni (tabla_dni_y_ausencias[3, 0]));
					grafico_2.agregar_nombre_a_la_barra (grafico_2.etiquetas[3]);
					grafico_2.agregar_punto_de_dato (tabla_dni_y_ausencias[3, 1]);
					grafico_2.agregar_color_a_la_barra (Color.SpringGreen);
					grafico_2.agregar_color_al_centro_de_la_barra (Color.Snow);

					grafico_2.agregar_barra ();
				}

				if (tabla_dni_y_ausencias[4, 1] != 0)
				{
					grafico_2.agregar_etiqueta (obtener_nombre_segun_el_dni (tabla_dni_y_ausencias[4, 0]));
					grafico_2.agregar_nombre_a_la_barra (grafico_2.etiquetas[4]);
					grafico_2.agregar_punto_de_dato (tabla_dni_y_ausencias[4, 1]);
					grafico_2.agregar_color_a_la_barra (Color.Silver);
					grafico_2.agregar_color_al_centro_de_la_barra (Color.Snow);

					grafico_2.agregar_barra ();
				}

				vector_para_borrado[1] = true;

				// Si ninguna de las primeras posiciónes de la matriz tiene ausencias, entonces no hay registros de ausencia para esa fecha.
				if ((tabla_dni_y_ausencias[0, 1] == 0) && (tabla_dni_y_ausencias[1, 1] == 0) && (tabla_dni_y_ausencias[2, 1] == 0) && (tabla_dni_y_ausencias[3, 1] == 0) && (tabla_dni_y_ausencias[4, 1] == 0))
				{
					MessageBox.Show ("No hay registros de ausencia para la fecha indicada");
					vector_para_borrado[1] = false;
				}

				// Esto permite generar su escala correcta.
				grafico_2.refrescar_grafico ();

				data_set.Tables["tabla_del_grafico_2"].Clear();
				
			}
		}

		private void btn_cinco_empleados_que_mas_faltaron_desde_su_alta_Click (object sender, EventArgs e)
		{

			grafico_circular = new Grafico_redondo ();

			verificador_de_visualizaciones[2] = true;
			
			btn_cinco_empleados_que_mas_faltaron_desde_su_alta.Enabled = false;

			if (verificador_de_visualizaciones[0] == true)
			{
				grafico_1.Visible = false;
				boton_generar_grafico_1.Visible = false;
				btn_ausentismo_de_un_empleado_por_mes_y_anio.Enabled = true;
				verificador_de_visualizaciones[0] = false;
			}

			if (verificador_de_visualizaciones[1] == true)
			{
				grafico_2.Visible = false;
				boton_generar_grafico_2.Visible = false;
				btn_cinco_empleados_que_mas_faltaron_en_un_determinado_mes_y_anio.Enabled = true;
				verificador_de_visualizaciones[1] = false;
			}

			if (verificador_de_visualizaciones[3] == true)
			{
				grafico_4.Visible = false;
				boton_generar_grafico_4.Visible = false;
				btn_rango_de_entrada_y_salida_en_promedio_de_un_determinado_empleado.Enabled = true;
				verificador_de_visualizaciones[3] = false;
			}

			boton_generar_grafico_3 = new Button ();

			boton_generar_grafico_3.Visible = true;

			// Al boton generar gráfico le asigno el evento Click.
			boton_generar_grafico_3.Click += new EventHandler (boton_generar_grafico_3_Click);
			this.inicializar_boton_generar_grafico (ref boton_generar_grafico_3, 500, 20);

			Controls.Add (boton_generar_grafico_3);
			Controls.Add (grafico_circular);

			// Se ajustan las propiedades visible de las etiquetas y combos en true, ya que otros gráficos no la utilizan.
			etiqueta_del_combo_dni_del_cliente.Visible = false;
			etiqueta_del_combo_del_mes.Visible = false;
			etiqueta_del_combo_del_anio.Visible = false;

			combo_dni_del_cliente.Visible = false;
			combo_mes.Visible = false;
			combo_anio.Visible = false;

		}

		private void boton_generar_grafico_3_Click (object sender, EventArgs e)
		{

			Acceso_a_datos acceso_a_datos = new Acceso_a_datos ();

			int cantidad_de_dias_habiles_en_total;
			int dia_de_alta, mes_de_alta, anio_de_alta;
			int dia_ultima_vez_presente, mes_ultima_vez_presente, anio_ultima_vez_presente;
			int dias_presente;
			int dias_ausente;

			int cantidad_de_personas = data_set.Tables["dni_y_nombre_de_los_empleados"].Rows.Count;
			int[,] tabla_dni_y_ausencias = new int[cantidad_de_personas, 2];
			int cantidad_total_de_registros;

			int dni_de_la_persona_i;

			int posicion_para_la_tabla_dni_ausencias = 0;	// NO MODIFICAR LUEGO.

			// Primero se limpia el gráfico de datos anteriores.
			if (vector_para_borrado[2] == true)
			{
				grafico_circular.limpiar_grafico ("Cinco empleados que más faltaron desde su alta");

			}

			// Se inicializa esta matriz que se utilizará luego.
			for (int i = 0; i < cantidad_de_personas; i++)
			{
				tabla_dni_y_ausencias[i, 0] = 0;
				tabla_dni_y_ausencias[i, 1] = 0;
			}

			/*
			 * La idea de la toma de datos es:
			 * Por cada dni, contar la cantidad de registros que contiene y asimismo, si corresponde,
			 * acumular en dias_habiles_en_total la cantidad de días hábiles que tiene ese mes y año
			 * en particular.
			 *	
			 * La cantidad de dias ausente se calcula como (dias habiles en total - cantidad de dias presentes).
			 * 
			 * Luego ese dato, junto con el dni, va hacia la fila n++ de tabla_dni_y_ausencias.
			 * 
			 * Luego, esta tabla se ordena por la columna ausencias (osea la segunda columna==[1])
			 * de forma descendente.
			 * 
			 * Al final, se toman los primeros cinco registros de dicha tabla, siempre y cuando la 
			 * ausencia sea diferente de 0, porque puede que haya menos de 5 personas que tuvieron faltas.
			 *
			 * Para el gráfico, por cada fila, toma el dni y busca qué nombre tiene el empleado con ese dni.
			 * Lo cual sería una etiqueta para el gráfico (titulo del eje x). Para el eje y sería el dato
			 * que corresponde a la segunda columna de la tabla.
			 */

			for (int i = 0; i < cantidad_de_personas; i++) // Por cada dni que exista...
			{

				dni_de_la_persona_i = (int) combo_dni_del_cliente.Items[i];
				/*
				 * Para simplificar todo, hago un procedimiento almacenado que me devuelva
				 * dia, mes, anio de la presencia de un empleado en particular.
				 */
				acceso_a_datos.ruta_a_la_base_de_datos = ruta_a_la_bd;
				acceso_a_datos.sentencia_de_sql = "EXECUTE generar_las_presencias_para_este_dni " + dni_de_la_persona_i.ToString ();
				acceso_a_datos.conectar_a_la_base_de_datos ();
				acceso_a_datos.obtener_el_adaptador ();
				acceso_a_datos.agregar_los_datos_a_una_tabla_en_el_data_set (ref data_set, "tabla_del_grafico_3");

				cantidad_total_de_registros = data_set.Tables["tabla_del_grafico_3"].Rows.Count;

				// Si la persona ingresada al sistema tiene ausencias...
				if (cantidad_total_de_registros > 0)
				{

					// Como esto se hará para cada persona, entonces...
					cantidad_de_dias_habiles_en_total = 0;
					dia_de_alta = mes_de_alta = anio_de_alta = 0;
					dia_ultima_vez_presente = mes_ultima_vez_presente = anio_ultima_vez_presente = 0;
					dias_presente = 0;
					dias_ausente = 0;

					// Primero se debe tomar la fecha de alta del empleado en cuestión...
					acceso_a_datos.sentencia_de_sql = "EXECUTE get_fecha_de_alta_de_este_dni " + dni_de_la_persona_i.ToString ();
					acceso_a_datos.conectar_a_la_base_de_datos ();
					acceso_a_datos.obtener_el_adaptador ();
					acceso_a_datos.agregar_los_datos_a_una_tabla_en_el_data_set (ref data_set, "fecha_de_alta_del_empleado");

					// Luego se asignaran los respectivos valores a las variables
					dia_de_alta = (int) data_set.Tables["fecha_de_alta_del_empleado"].Rows[0][0];
					mes_de_alta = (int) data_set.Tables["fecha_de_alta_del_empleado"].Rows[0][1];
					anio_de_alta = (int) data_set.Tables["fecha_de_alta_del_empleado"].Rows[0][2];



					// La fecha de la última vez presente existe en la última fila de la tabla del data set ya que se encuentra ordenada.
					dia_ultima_vez_presente = (int) data_set.Tables["tabla_del_grafico_3"].Rows[(cantidad_total_de_registros - 1)][0];
					mes_ultima_vez_presente = (int) data_set.Tables["tabla_del_grafico_3"].Rows[(cantidad_total_de_registros - 1)][1];
					anio_ultima_vez_presente = (int) data_set.Tables["tabla_del_grafico_3"].Rows[(cantidad_total_de_registros - 1)][2];

					// Ahora se llama a un procedimiento que devuelve la cantidad de días habiles en total desde su inscripción hasta el último día en que estuvo presente.
					cantidad_de_dias_habiles_en_total = get_cantidad_de_dias_habiles_para_el_tercer_grafico (dia_de_alta, mes_de_alta, anio_de_alta);

					// Luego cuenta los dias presente...
					dias_presente = data_set.Tables["tabla_del_grafico_3"].Rows.Count;

					// la cantidad de días ausente...
					dias_ausente = (cantidad_de_dias_habiles_en_total - dias_presente);

					// Y por último agrega esto a la tabla dni_ausencia.
					tabla_dni_y_ausencias[posicion_para_la_tabla_dni_ausencias, 0] = dni_de_la_persona_i;
					tabla_dni_y_ausencias[posicion_para_la_tabla_dni_ausencias, 1] = dias_ausente;

					// Antes de seguir con el siguiente empleado, se limpian las tablas e incrementa la posicion de la tabla dni_ausencias.
					posicion_para_la_tabla_dni_ausencias++;
					data_set.Tables["fecha_de_alta_del_empleado"].Clear ();
					
				}
				data_set.Tables["tabla_del_grafico_3"].Clear ();
			}

			// En esta parte la matriz con datos del dni y cantidad de ausencias de la persona ya estaría cargada.
			// Entonces se ordena por su columna cantidad de ausencia en forma descendente.
			int posmax, dni_aux, ausencias_aux;

			for (int i = 0; i < (cantidad_de_personas-1); i++)
			{
				posmax = i;

				for (int z = (i + 1); z < cantidad_de_personas; z++)
				{
					if (tabla_dni_y_ausencias[z, 1] > tabla_dni_y_ausencias[posmax, 1])
					{
						posmax = z;
					}
				}

				dni_aux = tabla_dni_y_ausencias[posmax, 0];
				ausencias_aux = tabla_dni_y_ausencias[posmax, 1];

				tabla_dni_y_ausencias[posmax, 0] = tabla_dni_y_ausencias[i, 0];
				tabla_dni_y_ausencias[posmax, 1] = tabla_dni_y_ausencias[i, 1];

				tabla_dni_y_ausencias[i, 0] = dni_aux;
				tabla_dni_y_ausencias[i, 1] = ausencias_aux;
			}

			// Ahora se agregan los datos al gráfico, siempre y cuando estos empleados tengan ausencias.

			if (tabla_dni_y_ausencias[0, 1] != 0)
			{
				// El método agregar dato es public void agregar_dato(string nombre_del_empleado, int suma_de_ausencias)

				grafico_circular.agregar_dato (obtener_nombre_segun_el_dni (tabla_dni_y_ausencias[0, 0]), tabla_dni_y_ausencias[0, 1]);
			}

			if (tabla_dni_y_ausencias[1, 1] != 0)
			{
				grafico_circular.agregar_dato (obtener_nombre_segun_el_dni (tabla_dni_y_ausencias[1, 0]), tabla_dni_y_ausencias[1, 1]);
			}

			if (tabla_dni_y_ausencias[2, 1] != 0)
			{
				grafico_circular.agregar_dato (obtener_nombre_segun_el_dni (tabla_dni_y_ausencias[2, 0]), tabla_dni_y_ausencias[2, 1]);
			}

			if (tabla_dni_y_ausencias[3, 1] != 0)
			{
				grafico_circular.agregar_dato (obtener_nombre_segun_el_dni (tabla_dni_y_ausencias[3, 0]), tabla_dni_y_ausencias[3, 1]);
			}

			if (tabla_dni_y_ausencias[4, 1] != 0)
			{
				grafico_circular.agregar_dato (obtener_nombre_segun_el_dni (tabla_dni_y_ausencias[4, 0]), tabla_dni_y_ausencias[4, 1]);
			}

			grafico_circular.agregar_todas_las_divisiones_al_grafico ();
			grafico_circular.refrescar_grafico ();

			vector_para_borrado[2] = true;

			// Si no hay ningún registro a mostrar, entonces mostrar el mensaje.
			if ((tabla_dni_y_ausencias[0, 1] == 0) && (tabla_dni_y_ausencias[1, 1] == 0) && (tabla_dni_y_ausencias[2, 1] == 0) && (tabla_dni_y_ausencias[3, 1] == 0) && (tabla_dni_y_ausencias[4, 1] == 0))
			{
				MessageBox.Show ("No hay registros de ausencia para la fecha indicada");
				vector_para_borrado[1] = false;
			}

		}

		private void btn_rango_de_entrada_y_salida_en_promedio_de_un_determinado_empleado_Click (object sender, EventArgs e)
		{
			grafico_4 = new Grafico_de_puntos ();

			verificador_de_visualizaciones[3] = true;
			
			btn_rango_de_entrada_y_salida_en_promedio_de_un_determinado_empleado.Enabled = false;

			if (verificador_de_visualizaciones[0] == true)
			{
				grafico_1.Visible = false;
				boton_generar_grafico_1.Visible = false;
				btn_ausentismo_de_un_empleado_por_mes_y_anio.Enabled = true;
				verificador_de_visualizaciones[0] = false;
			}

			if (verificador_de_visualizaciones[1] == true)
			{
				grafico_2.Visible = false;
				boton_generar_grafico_2.Visible = false;
				btn_cinco_empleados_que_mas_faltaron_en_un_determinado_mes_y_anio.Enabled = true;
				verificador_de_visualizaciones[1] = false;
			}

			if (verificador_de_visualizaciones[2] == true)
			{
				grafico_circular.Visible = false;
				boton_generar_grafico_3.Visible = false;
				btn_cinco_empleados_que_mas_faltaron_desde_su_alta.Enabled = true;
				verificador_de_visualizaciones[2] = false;
			}

			boton_generar_grafico_4 = new Button ();

			boton_generar_grafico_4.Visible = true;

			// Al boton generar gráfico le asigno el evento Click.
			boton_generar_grafico_4.Click += new EventHandler (boton_generar_grafico_4_Click);
			this.inicializar_boton_generar_grafico (ref boton_generar_grafico_4, 500, 20);

			Controls.Add (boton_generar_grafico_4);

			// Se ajustan las propiedades visible de las etiquetas y combos en true, ya que otros gráficos no la utilizan.
			etiqueta_del_combo_dni_del_cliente.Visible = true;
			etiqueta_del_combo_del_mes.Visible = true;
			etiqueta_del_combo_del_anio.Visible = true;

			combo_dni_del_cliente.Visible = true;
			combo_mes.Visible = true;
			combo_anio.Visible = true;

			// Como ya se agregó al dataset la tabla con los dni de los clientes, ahora se carga el combo con esa tabla sólo si no fué
			// cargado antes.
			if (combo_dni_del_cliente.Items.Count == 0)
			{
				agregar_a_combobox_dni_de_los_clientes_todos_los_dnis_del_data_set (ref combo_dni_del_cliente, ref data_set);
			}

			Controls.Add (grafico_4);

			grafico_4.agregar_titulos_al_grafico ("Rango de entrada y salida en promedio de un determinado empleado", "Horas");

			//grafico_4.modificar_tipo_de_ejes (AxisType.Ordinal, AxisType.Text);

			//grafico_4.GraphPane.XAxis.Scale.Format = "HH:MM";
			//grafico_4.GraphPane.XAxis.Scale.MajorUnit = DateUnit.Hour;
			//grafico_4.GraphPane.XAxis.Scale.MinorUnit = DateUnit.Hour;
			
			//grafico_4.GraphPane.XAxis.Scale.MinorStep = 1;
			//grafico_4.GraphPane.YAxis.Scale.MajorStep = 5;

			// Oculta el eje Y porque este gráfico no lo necesita.
			grafico_4.GraphPane.YAxis.IsVisible = false;

			//grafico_4.modificar_escala_x (0, 23);

		}

		private void boton_generar_grafico_4_Click (object sender, EventArgs e)
		{
			Acceso_a_datos acceso_a_datos = new Acceso_a_datos ();

			int dni_empleado, mes, anio;

			int cantidad_de_registros;

			int promedio_hora_ingreso, promedio_minutos_ingreso;
			int promedio_hora_egreso, promedio_minutos_egreso;
			double primer_x, segundo_x;

			String nombre_del_empleado_elegido;

			promedio_hora_ingreso = promedio_minutos_ingreso = 0;
			promedio_hora_egreso = promedio_minutos_egreso = 0;
			primer_x = segundo_x = 0;

			// Sólo se genera el gráfico, si hay items seleccionados en cada combobox.
			if (combo_dni_del_cliente.SelectedItem != null && combo_mes.SelectedItem != null && combo_anio.SelectedItem != null)
			{
				// Primero limpia el gráfico de datos anteriores.
				if (vector_para_borrado[3] == true)
				{
					grafico_4.limpiar_grafico ("Rango de entrada y salida en promedio de un determinado empleado", "Horas");

				}

				dni_empleado = (int) combo_dni_del_cliente.SelectedItem;
				mes = (int) combo_mes.SelectedItem;
				anio = (int) combo_anio.SelectedItem;

				// Primero genera la tabla en el DataSet llamada tabla_del_grafico_4.
				acceso_a_datos.ruta_a_la_base_de_datos = ruta_a_la_bd;
				acceso_a_datos.sentencia_de_sql = "EXECUTE rango_de_entrada_y_salida_en_promedio_por_empleado " + dni_empleado.ToString () + ", " + mes.ToString () + ", " + anio.ToString ();
				acceso_a_datos.conectar_a_la_base_de_datos ();
				acceso_a_datos.obtener_el_adaptador ();
				acceso_a_datos.agregar_los_datos_a_una_tabla_en_el_data_set (ref data_set, "tabla_del_grafico_4");

				/*
				 * Lo siguiente contendra a cada fecha para luego enviarla a un procedimiento que modifica por referencia
				 * los valores de las variables hora_ingreso, hora_egreso, &c para luego sacar el promedio.
				 */

				cantidad_de_registros = data_set.Tables["tabla_del_grafico_4"].Rows.Count;

				String[] hora_y_minutos_de_ingreso = new String[cantidad_de_registros];
				String[] hora_y_minutos_de_egreso = new String[cantidad_de_registros];

				// Si la persona elegida tiene registros de ingreso...
				if (cantidad_de_registros > 0)
				{

					/*
					 * En el for toma la hora y minutos de ingreso del DataSet y va cargando el vector.
					 * Idem para el siguiente vector.
					 * Tener en cuenta que la tabla es dia, hora ingreso, minutos ingreso, hora egreso, minutos egreso.
					 */
					for (int i = 0; i < data_set.Tables["tabla_del_grafico_4"].Rows.Count; i++)
					{
						hora_y_minutos_de_ingreso[i] = data_set.Tables["tabla_del_grafico_4"].Rows[i][1].ToString () + ":" + data_set.Tables["tabla_del_grafico_4"].Rows[i][2].ToString ();

						hora_y_minutos_de_egreso[i] = data_set.Tables["tabla_del_grafico_4"].Rows[i][3].ToString () + ":" + data_set.Tables["tabla_del_grafico_4"].Rows[i][4].ToString ();
					}

					// El procedimiento me devolverá en las variables int (desde la tercera en adelante) los valores correspondientes.
					get_promedio_de_horas (ref hora_y_minutos_de_ingreso, ref hora_y_minutos_de_egreso, ref promedio_hora_ingreso, ref promedio_minutos_ingreso, ref promedio_hora_egreso, ref promedio_minutos_egreso);

					/*
					 * Ahora como el gráfico necesita un valor double para hora:minutos lo que hago es:
					 * La parte entera será la hora. La parte decimal serán los minutos.
					 * Luego, este nuevo valor Double generado, será el punto x del gráfico.
					 */
					primer_x = promedio_hora_ingreso + (promedio_minutos_ingreso * 0.01);
					segundo_x = promedio_hora_egreso + (promedio_minutos_egreso * 0.01);

					grafico_4.agregar_puntos_de_datos (primer_x, segundo_x);

					// Con los datos tomados genera la curva.
					grafico_4.generar_la_curva ("curva", Color.Blue, SymbolType.Circle);

					grafico_4.refrescar_grafico ();

					data_set.Tables["tabla_del_grafico_4"].Clear ();
					vector_para_borrado[3] = true;
				}
				else
				{
					data_set.Tables["tabla_del_grafico_4"].Clear ();
					nombre_del_empleado_elegido = this.obtener_nombre_segun_el_dni (dni_empleado);
					MessageBox.Show (nombre_del_empleado_elegido + " no tiene registros en el mes y año seleccionados");
				}
			}
		}

		private void inicializar_verificador_de_visualizaciones ()
		{
			for (int i = 0; i < 4; i++)
			{
				verificador_de_visualizaciones[i] = false;
			}
		}

		private void inicializar_anios (ref int[] anios)
		{
			int anio_inicial = 2000;
			int i = 0;
			
			//for (int i = 0; i <30; i++)
			//{
			//        anios[i] = anio_inicial++;
			//}

			// Cargar los años desde el año inicial hasta el año actual inclusive.
			while (anio_inicial <= DateTime.Today.Year)
			{
				anios[i] = anio_inicial;
				anio_inicial++;
				i++;
			}
		}

		private void inicializar_meses (ref int[] meses)
		{
			int mes_inicial = 1;

			for (int i = 0; i < 12; i++)
			{
				meses[i] = mes_inicial++;
			}

		}

		private void agregar_meses_al_combo_mes (ref ComboBox combin)
		{
			for (int i = 0; i < 12; i++)
			{
				combin.Items.Add (meses[i]);
			}
		}

		private void agregar_anios_al_combo_anio (ref ComboBox combin)
		{

			for (int i = 0; i <= (DateTime.Today.Year - 2000); i++)
			{
				combin.Items.Add (anios[i]);
			}

		}

		public void inicializar_combo_dni_del_cliente (int x, int y)
		{
			punto_del_objeto.X = x;
			punto_del_objeto.Y = y;
			combo_dni_del_cliente.Location = punto_del_objeto;
			combo_dni_del_cliente.Size = tamanio;
		}

		private void inicializar_alto_y_ancho_de_combos_y_etiquetas (int x, int y)
		{
			tamanio.Width = x;
			tamanio.Height = y;
		}

		private void inicializar_boton_generar_grafico (ref Button boton, int x, int y)
		{
			Size puntos_de_tamanio = new Size ();

			punto_del_objeto.X = x;
			punto_del_objeto.Y = y;
			boton.Location = punto_del_objeto;

			puntos_de_tamanio.Width = 90;
			puntos_de_tamanio.Height = 23;
			boton.Size = puntos_de_tamanio;

			boton.Text = "Generar";
		}

		private void inicializar_combo_mes (int x, int y)
		{
			punto_del_objeto.X = x;
			punto_del_objeto.Y = y;
			combo_mes.Location = punto_del_objeto;
			combo_mes.Size = tamanio;
		}
		private void inicializar_combo_anio (int x, int y)
		{
			punto_del_objeto.X = x;
			punto_del_objeto.Y = y;
			combo_anio.Location = punto_del_objeto;
			combo_anio.Size = tamanio;
		}

		private void inicializar_etiqueta_dni_del_cliente (int x, int y)
		{
			etiqueta_del_combo_dni_del_cliente.Text = "Dni del empleado";
			punto_del_objeto.X = x;
			punto_del_objeto.Y = y;
			etiqueta_del_combo_dni_del_cliente.Location = punto_del_objeto;
			etiqueta_del_combo_dni_del_cliente.Size = tamanio;
		}

		private void inicializar_etiqueta_mes (int x, int y)
		{
			etiqueta_del_combo_del_mes.Text = "Mes";
			punto_del_objeto.X = x;
			punto_del_objeto.Y = y;
			etiqueta_del_combo_del_mes.Location = punto_del_objeto;
			etiqueta_del_combo_del_mes.Size = tamanio;
		}
		private void inicializar_etiqueta_anio (int x, int y)
		{
			etiqueta_del_combo_del_anio.Text = "Año";
			punto_del_objeto.X = x;
			punto_del_objeto.Y = y;
			etiqueta_del_combo_del_anio.Location = punto_del_objeto;
			etiqueta_del_combo_del_anio.Size = tamanio;
		}

		private void tomar_de_la_base_de_datos_los_dni_de_los_clientes_para_el_combo_dni (ref DataSet ds)
		{
			Acceso_a_datos acceso_a_los_datos = new Acceso_a_datos ();

			acceso_a_los_datos.sentencia_de_sql = consulta_del_combo_dni;
			acceso_a_los_datos.ruta_a_la_base_de_datos = ruta_a_la_bd;
			acceso_a_los_datos.conectar_a_la_base_de_datos ();
			acceso_a_los_datos.obtener_el_adaptador ();

			acceso_a_los_datos.agregar_los_datos_a_una_tabla_en_el_data_set (ref ds, "tabla_dni_de_los_clientes");
		}

		private void tomar_de_la_base_de_datos_los_dni_y_nombre_de_los_clientes (ref DataSet ds)
		{
			Acceso_a_datos acceso_a_los_datos = new Acceso_a_datos ();

			acceso_a_los_datos.sentencia_de_sql = consulta_de_dni_y_nombres_de_los_clientes;
			acceso_a_los_datos.ruta_a_la_base_de_datos = ruta_a_la_bd;
			acceso_a_los_datos.conectar_a_la_base_de_datos ();
			acceso_a_los_datos.obtener_el_adaptador ();

			acceso_a_los_datos.agregar_los_datos_a_una_tabla_en_el_data_set (ref ds, "dni_y_nombre_de_los_empleados");
		}

		public void inicializar_propiedades_y_agregar_al_formulario_las_etiquetas_y_combos ()
		{
			// Configura la posicion  y texto de los combos
			// Solo se modifica algunas veces X para que esten alineados.
			// Se modifica además su tamaño.
			this.inicializar_alto_y_ancho_de_combos_y_etiquetas (120, 13);

			this.inicializar_etiqueta_dni_del_cliente (220, 20);
			this.inicializar_etiqueta_mes (220, 50);
			this.inicializar_etiqueta_anio (220, 80);

			this.inicializar_combo_dni_del_cliente (350, 20);
			this.inicializar_combo_mes (350, 50);
			this.inicializar_combo_anio (350, 80);

			// Se ajustan las propiedades visible de las etiquetas y combos en true, ya que otros gráficos no la utilizan.
			etiqueta_del_combo_dni_del_cliente.Visible = false;
			etiqueta_del_combo_del_mes.Visible = false;
			etiqueta_del_combo_del_anio.Visible = false;

			combo_dni_del_cliente.Visible = false;
			combo_mes.Visible = false;
			combo_anio.Visible = false;

			agregar_meses_al_combo_mes (ref combo_mes);
			agregar_anios_al_combo_anio (ref combo_anio);

			Controls.Add (etiqueta_del_combo_dni_del_cliente);
			Controls.Add (etiqueta_del_combo_del_mes);
			Controls.Add (etiqueta_del_combo_del_anio);

			Controls.Add (combo_dni_del_cliente);
			Controls.Add (combo_mes);
			Controls.Add (combo_anio);
		}

		private int get_cantidad_de_dias_en_el_mes (DateTime una_fecha)
		{
			return DateTime.DaysInMonth (una_fecha.Year, una_fecha.Month);
		}

		private int get_cantidad_de_dias_en_el_mes (int anio, int mes)
		{
			DateTime fecha_tomada = new DateTime (anio, mes, 1);

			return DateTime.DaysInMonth (fecha_tomada.Year, fecha_tomada.Month);
		}

		private int get_cantidad_de_fines_de_semana (DateTime otra_fecha)
		{
			/* Para saber si es fin de semana se realiza lo siguiente:
			*
			* De la fecha a comparar, el dia NECESARIAMENTE debe ser 1; entonces hace un ciclo de cantidad de dias que tiene el mes
			* iteraciónes y compara si dia n es sabado o domingo y si lo es incrementa una variable. Se retorna entonces esa variable.
			*/

			int cantidad_de_dias_en_el_mes = get_cantidad_de_dias_en_el_mes (otra_fecha);
			int cantidad_de_fines_de_semana_en_el_mes = 0;

			for (int i = 1; i <= cantidad_de_dias_en_el_mes; i++)
			{
				if ((otra_fecha.DayOfWeek == DayOfWeek.Saturday) || (otra_fecha.DayOfWeek == DayOfWeek.Sunday))
				{
					cantidad_de_fines_de_semana_en_el_mes++;
				}

				otra_fecha = otra_fecha.AddDays (1);
			}

			return cantidad_de_fines_de_semana_en_el_mes;
		}

		private int get_cantidad_de_fines_de_semana (int anio, int mes)
		{
			/* Para saber si es fin de semana se realiza lo siguiente:
			*
			* De la fecha a comparar, el dia NECESARIAMENTE debe es 1; entonces hace un ciclo de cantidad de dias que tiene el mes
			* iteraciónes y compara si dia n es sabado o domingo y si lo es incrementa una variable. Se retorna entonces esa variable.
			*/

			/*
			 * Devuelve la cantidad de días fines de semana que el MES dado tiene.
			 */

			DateTime otra_fecha = new DateTime (anio, mes, 1);

			int cantidad_de_dias_en_el_mes = get_cantidad_de_dias_en_el_mes (otra_fecha);
			int cantidad_de_fines_de_semana_en_el_mes = 0;

			for (int i = 1; i <= cantidad_de_dias_en_el_mes; i++)
			{
				if ((otra_fecha.DayOfWeek == DayOfWeek.Saturday) || (otra_fecha.DayOfWeek == DayOfWeek.Sunday))
				{
					cantidad_de_fines_de_semana_en_el_mes++;
				}

				otra_fecha = otra_fecha.AddDays(1);
			}

			return cantidad_de_fines_de_semana_en_el_mes;
		}

		private int get_cantidad_de_fines_de_semana_desde_el_comienzo_del_actual_mes_hasta_el_dia_actual()
		{
			/* Para saber si es fin de semana se realiza lo siguiente:
			*
			* Se toma la fecha actual pero con el día=1. Entonces hace un ciclo desde 1 hasta el número de días de hoy
			* y compara si dia i es sabado o domingo y si lo es incrementa una variable. Se retorna entonces esa variable.
			*/

			/*
			 * Este método difiere mucho de los 2 anteriores. El objetivo de éste es tomar la cantidad de días de fines
			 * de semana que existen desde el comienzo de mes hasta la fecha; A diferencia de los otros que devolvian la
			 * cantidad de días fines de semana de TODO el mes.
			 */


			// Este objeto tiene dia=1, mes actual y año actual. Entonces se incrementa de a días hasta llegar al dia de hoy.
			DateTime fecha_a_incrementar = new DateTime (DateTime.Today.Year, DateTime.Today.Month, 1);

			//int cantidad_de_dias_en_el_mes = get_cantidad_de_dias_en_el_mes (otra_fecha);
			int cantidad_de_fines_de_semana_en_el_mes = 0;

			for (int i = 1; i <= (DateTime.Today.Day); i++)
			{
				if ((fecha_a_incrementar.DayOfWeek == DayOfWeek.Saturday) || (fecha_a_incrementar.DayOfWeek == DayOfWeek.Sunday))
				{
					cantidad_de_fines_de_semana_en_el_mes++;
				}

				fecha_a_incrementar = fecha_a_incrementar.AddDays (1);
			}

			return cantidad_de_fines_de_semana_en_el_mes;
		}

		private String obtener_nombre_segun_el_dni (int _dni)
		{
			String nombre_del_empleado = "En el ciclo tendra su valor correspondiente.";

			foreach (DataRow fila in data_set.Tables["dni_y_nombre_de_los_empleados"].Rows)
			{
				// Si el dni coincide con el dni[i], entonces tomar su nombre[i] y su apellido[i].
				if (_dni == (int) fila[0])
				{
					nombre_del_empleado = fila[1].ToString ();
					nombre_del_empleado += " " + fila[2].ToString ();
				}
			}

			return nombre_del_empleado;
		}

		public void get_promedio_de_horas (ref String [] horas_ingreso, ref String [] horas_egreso, ref int media_horas_ingreso, ref int media_minutos_ingreso, ref int media_horas_egreso, ref int media_minutos_egreso)
		{
			/*
			 * Para obtener un promedio de hora:
			 * 1.- Se genera en un vector de String, la hora con formato HH:MM
			 * 2.- Luego, para los cálculos, se toma a esta cadena y se le agrega los segundos :00
			 * 3.- Entonces se acumulan sus ticks (número que identifica a una hora minuto y segundo en particular.
			 * 4.- Se divide por el total elementos del vector, osea: (tiempo_total_ingreso.Ticks / horas_ingreso.Length)
			 * 5.- Y con esa media de ticks (promedio de las horas y minutos) genero un objeto de la clase TimeSpan (para poder recuperar nuevamente la hora).
			 * 6.- De ese objeto timespan le extraigo los valores de sus propiedades horas y minutos y éstos se los asigno a las variables tomadas por parámetro, las cuales se utilizarán luego para el 4to gráfico.
			 */

			TimeSpan tiempo_total_ingreso = new TimeSpan ();
			TimeSpan tiempo_total_egreso = new TimeSpan();

			foreach (String hora in horas_ingreso)
			{
				tiempo_total_ingreso += TimeSpan.Parse (hora + ":00");
			}

			foreach (String hora in horas_egreso)
			{
				tiempo_total_egreso += TimeSpan.Parse (hora + ":00");
			}

			long media_de_ticks_ingreso = (tiempo_total_ingreso.Ticks / horas_ingreso.Length);
			long media_de_ticks_egreso = (tiempo_total_egreso.Ticks / horas_egreso.Length);

			TimeSpan media_ingreso = new TimeSpan (media_de_ticks_ingreso);
			TimeSpan media_egreso = new TimeSpan (media_de_ticks_egreso);

			media_horas_ingreso = media_ingreso.Hours;
			media_minutos_ingreso = media_ingreso.Minutes;

			media_horas_egreso = media_egreso.Hours;
			media_minutos_egreso = media_egreso.Minutes;
		}

		public void agregar_a_combobox_dni_de_los_clientes_todos_los_dnis_del_data_set (ref ComboBox combin, ref DataSet ds)
		{
			foreach (DataRow fila in ds.Tables["tabla_dni_de_los_clientes"].Rows)
			{
				combin.Items.Add(fila[0]) ;
			}
		}

		public void tomar_de_la_base_la_cantidad_de_registros_de_ingreso_que_tiene_este_dni (int _dni)
		{
			Acceso_a_datos acceso_a_datos = new Acceso_a_datos();
			acceso_a_datos.ruta_a_la_base_de_datos = ruta_a_la_bd;
			acceso_a_datos.sentencia_de_sql = "EXECUTE cantidad_de_registros_de_ingresos_segun_dni " + _dni.ToString();

			acceso_a_datos.conectar_a_la_base_de_datos ();
			acceso_a_datos.obtener_el_adaptador ();
			acceso_a_datos.agregar_los_datos_a_una_tabla_en_el_data_set (ref data_set, "cantidad_de_registros_de_ingreso");
		}

		public int get_cantidad_de_dias_habiles_para_el_tercer_grafico (int dia_de_alta, int mes_de_alta, int anio_de_alta)
		{
			int cantidad_de_dias_habiles_en_total = 0;
			int dia_i, mes_i, anio_i;	// Para comprender mejor el tema, utilizo una fecha que se va incrementando.

			dia_i = dia_de_alta;
			mes_i = mes_de_alta;
			anio_i = anio_de_alta;

			// Mientras que el mes y año i sean distinto que el mes y año actual...
			while (!((mes_i == DateTime.Today.Month) && (anio_i == DateTime.Today.Year)))	// Observar que la igualdad está negada.
			{
				cantidad_de_dias_habiles_en_total += (get_cantidad_de_dias_en_el_mes (anio_i, mes_i) - get_cantidad_de_fines_de_semana (anio_i, mes_i));

				if (mes_i == 12)
				{
					mes_i = 1;
					anio_i++;
				}
				else
				{
					mes_i++;
				}
			}

			// En esta parte mes_i es igual al mes actual y año_i es igual al año actual.
			cantidad_de_dias_habiles_en_total += (DateTime.Today.Day - get_cantidad_de_fines_de_semana_desde_el_comienzo_del_actual_mes_hasta_el_dia_actual ());

			return cantidad_de_dias_habiles_en_total;
		}

		private void agregar_datos_de_anio_mes_y_dni_a_los_combos()
		{
			// Como ya se agregó al dataset la tabla con los dni de los clientes, ahora se carga el combo con esa tabla sólo si no fué
			// cargado antes.
			if (combo_dni_del_cliente.Items.Count == 0)
			{
				agregar_a_combobox_dni_de_los_clientes_todos_los_dnis_del_data_set (ref combo_dni_del_cliente, ref data_set);
			}

			// Agrega los datos a los combos únicamente si no tiene.

			if ((combo_mes.Items.Count == 0) || (combo_anio.Items.Count == 0))
			{
				agregar_meses_al_combo_mes (ref combo_mes);
				agregar_anios_al_combo_anio (ref combo_anio);
			}
		}

		public void inicializar_el_vector_del_borrado ()
		{
			for (int i = 0; i < 4; i++)
			{
				vector_para_borrado[i] = false;
			}
		}

		private void segundo_formulario_Load_1 (object sender, EventArgs e)
		{
			this.inicializar_verificador_de_visualizaciones ();
			this.inicializar_anios (ref anios);
			this.inicializar_meses (ref meses);
			inicializar_propiedades_y_agregar_al_formulario_las_etiquetas_y_combos ();
			this.tomar_de_la_base_de_datos_los_dni_de_los_clientes_para_el_combo_dni (ref data_set);
			this.tomar_de_la_base_de_datos_los_dni_y_nombre_de_los_clientes (ref data_set);
			this.agregar_datos_de_anio_mes_y_dni_a_los_combos ();
			this.inicializar_el_vector_del_borrado ();
		}
	}
}
